#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: buscar_codificacion.py

##
# Módulos del sistema
# Parte gráfica
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"
# Utilidades
from datetime import datetime
from sqlobject.sqlbuilder import LIKE, AND

try:
    from gui.msj_retroalimentacion import MensajeDeAdvertencia, MensajeDeError
    from lib.database import GrupoDeResolucion, Estado, Clasificacion
    from gui.detalle_de_la_clasificacion import DetalleDeLaClasificacion
    from gui.modificar_clasificacion import ModificarClasificacion
    from lib.funciones_utiles import add_find_column, close
except ImportError, error:
    print error
    print "Error encontrado en gui/buscar_clasificacion.py"

class BuscarClasificacionTicket:
    def __init__(self, padre):
        self.gladefile = "gui/ghhp.glade"
        self.padre = padre
        self.wTree= gtk.glade.XML(self.gladefile, "BuscarClasificacionTicket")
        self.window = self.wTree.get_widget("BuscarClasificacionTicket")
        self.un_dict = {"on_button85_clicked": self.buscar_clasificacion,
                "on_button86_clicked": self.limpiar_campos,
                "on_button92_clicked": self.close,
                "on_button87_clicked": self.detalles_clasificacion,
                "on_button88_clicked": self.editar_clasificacion,
                "on_button89_clicked": self.borrar_clasificacion,
                "on_button90_clicked": self.aceptar,
                "on_button119_clicked": self.close}

        self.wTree.signal_autoconnect(self.un_dict)
        self.hbox_132 = self.wTree.get_widget("hbox132")
        self.hbox_133 = self.wTree.get_widget("hbox133")
        self.tree_resultado = self.wTree.get_widget("treeview21")
        self.lista_resultado = gtk.ListStore(str, str, str, str)
        self.tree_resultado.set_model(self.lista_resultado)
        self.armar_lista_resultados()
        self.combo_grupos = self.wTree.get_widget("combobox7")
        self.combo_grupos.set_model(gtk.ListStore(str))
        self.combo_estado = self.wTree.get_widget("combobox6")
        self.combo_estado.set_model(gtk.ListStore(str))
        self.lista_grupos = {}
        self.armar_combos()
        self.lista_clasificaciones = []
        self.codigo = self.wTree.get_widget("entry92")
        self.nombre = self.wTree.get_widget("entry93")
        self.descripcion = self.wTree.get_widget("textview15")
        self.lista_widget = [self.nombre, self.descripcion]
        self.check_button = self.wTree.get_widget("checkbutton19")
        self.conect_entry_enter()
    
    def armar_lista_resultados(self):
        titulos = ["Codigo", "Nombre", "Descripcion", "Estado"]
        for pos,titulo in enumerate(titulos):
            add_find_column(titulo, pos, self.tree_resultado)

    def conect_entry_enter(self):
        """Permite generar the activate signal para los widget"""
        def grab_focus(widget, other):
            other.grab_focus()
            self.completar_campos()

        def groups(lista, n, step=1):
            for index in xrange(0, len(lista)-(n-1), step):
                yield lista[index:index+n]

        path =(self.codigo,
                self.nombre,
                self.descripcion)

        for from0, to in groups(path, 2):
            from0.connect("activate", grab_focus, to)

    def completar_campos(self):
        codigo = self.codigo.get_text()
        if codigo:
            consulta = Clasificacion.selectBy(id = codigo)
            try:
                self.lista_clasificaciones.append(consulta[0])
                self.nombre.set_text(self.lista_clasificaciones[0].nombre)
                #self.descripcion.get_buffer().set_text(
                #        self.lista_clasificaciones[0].descripcion)
                self.combo_grupos.grab_focus()
            except IndexError, error:
                print error
                msj = "Codigo de clasificacion inexistente en el sistema."
                msj_error = MensajeDeError(msj, self.window)
                msj_error.run()
                self.codigo.set_text('')
    
    def armar_combos(self):
        consulta_grupos = []
        # Llenamos el de los grupos
        consulta_grupos = GrupoDeResolucion.select()
        self.combo_grupos.append_text('')
        self.lista_grupos[''] = None
        for grupo in consulta_grupos:
            self.lista_grupos[grupo.nombre] = grupo
            self.combo_grupos.append_text(grupo.nombre)
        self.combo_grupos.set_active(0)
        # Estado
        self.combo_estado.append_text('')
        self.combo_estado.append_text('Activa')
        self.combo_estado.append_text('Desactiva')
        self.combo_estado.set_active(0)

    def buscar_clasificacion(self, widget):
        if self.check_button.get_active():
            # Busco todas las clasificaciones de la BD
            consulta = Clasificacion.select()
            bandera = False
            self.completar_criterios_de_busqueda()
            for clasificacion in consulta:
                self.lista_clasificaciones.append(clasificacion)
                if clasificacion.estado:
                    estado = "Activa"
                else:
                    estado = "Desactiva"
                lista = [clasificacion.id,
                        clasificacion.nombre,
                        clasificacion.descripcion,
                        estado]
                self.lista_resultado.append(lista)
                bandera = True
            if bandera:
                self.hbox_132.hide()
                self.hbox_133.show()
                self.window.resize(800,600)
            else:
                error = ["No existen clasificaciones en el sistema que",
                        "cumplan con los criterios establecidos"]
                msj = MensajeDeError("\n".join(error), self.window)
                msj.run()
        #Si puso el codigo ya tengo la clasificacion
        elif self.codigo.get_text():
            self.completar_criterios_de_busqueda()
            if self.lista_clasificaciones[0].estado:
                estado = "Activa"
            else:
                estado = "Desactiva"
            lista = [self.lista_clasificaciones[0].id,
                    self.lista_clasificaciones[0].nombre,
                    self.lista_clasificaciones[0].descripcion,
                    estado]
            self.lista_resultado.append(lista)
            self.hbox_132.hide()
            self.hbox_133.show()
            self.window.resize(800,600)
        # Ahora buscamos por todos los otros criterios 
        else:
            #LIKE: para ya tenerlo
            nombre = self.nombre.get_text()
            desc = self.descripcion.get_buffer()
            start = desc.get_start_iter()
            end = desc.get_end_iter()
            descripcion = desc.get_text(start, end)
            lista_widget = [nombre, descripcion]
            lista = [LIKE(Clasificacion.q.nombre,'%'+nombre+'%'),
                    LIKE(Clasificacion.q.descripcion,'%'+descripcion+'%')]
            # Recorremos y buscamos....
            consulta = ''
            for i,elemento in enumerate(lista_widget):
                if elemento:
                    consulta+=lista[i]
            if consulta:
                resultado = Clasificacion.select(AND(consulta))
            #Ahora comprobamos si tenemos grupo, para seguir filtrando o no
            if self.tomar_valor_combo(1):
                # Recorrer los grupos y vemos si corresponde la clasificacion
                lista = []
                grupo = self.tomar_valor_combo(1)
                # Si pusimos el nombre o la descripcion
                if consulta:
                    for clasificacion in resultado:
                        if clasificacion in grupo.clasificaciones:
                             lista.append(clasificacion)
                    resultado = lista
                else:
                    # Si no la pusimos no hicimos consulta, y necesitamos las
                    # clasificaciones de este grupo.
                    resultado = []
                    for clasificacion in grupo.clasificaciones:
                        resultado.append(clasificacion)
            try:
                # Mostramos las clasificaciones
                self.completar_criterios_de_busqueda()
                bandera = False
                for clasificacion in resultado:
                    self.lista_clasificaciones.append(clasificacion)
                    if clasificacion.estado:
                        estado = "Activa"
                    else:
                        estado = "Desactiva"
                    lista = [clasificacion.id,
                            clasificacion.nombre,
                            clasificacion.descripcion,
                            estado]
                    self.lista_resultado.append(lista)
                    bandera = True
                if bandera:
                    self.hbox_132.hide()
                    self.hbox_133.show()
                    self.window.resize(800,600)
                else:
                    error = ["No existen clasificaciones en el sistema que",
                            "cumplan con los criterios establecidos"]
                    msj = MensajeDeError("\n".join(error), self.window)
                    msj.run()
            except UnboundLocalError, error:
                error = ["Si quiero ver todas las clasificaciones debe",
                        "activar el checkbox y luego presionar buscar"]
                msj = MensajeDeError("\n".join(error), self.window)
                msj.run()

    def completar_criterios_de_busqueda(self):
        self.wTree.get_widget("label466").set_text(self.codigo.get_text())
        self.wTree.get_widget("label467").set_text(self.nombre.get_text())
        if self.tomar_valor_combo(1):
            self.wTree.get_widget("label468").set_text(self.tomar_valor_combo(1).nombre)
        else:
            self.wTree.get_widget("label468").set_text('')
        self.wTree.get_widget("label469").set_text('FIXME')
        #descripcion
        desc = self.descripcion.get_buffer()
        start = desc.get_start_iter()
        end = desc.get_end_iter()
        self.wTree.get_widget("label461").set_text(desc.get_text(start, end))

    def limpiar_campos(self, widget):
        self.codigo.set_text('')
        self.nombre.set_text('')
        self.descripcion.get_buffer().set_text('')
        #Combo
        self.combo_grupos.set_active(0)
        self.combo_estado.set_active(0)
        if self.check_button.get_active():
            print "Activo"
            self.check_button.set_active(False)

    def detalles_clasificacion(self, widget):
        model, path = self.tree_resultado.get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            self.detalles = DetalleDeLaClasificacion(self.window,
                    self.lista_clasificaciones[pos])
        else:
             error = "Para ver el detalle de la claficacion debe seleccionarla"
             msj = MensajeDeError(error, self.window)
             msj.run()

    def editar_clasificacion(self, widget):
        model, path = self.tree_resultado.get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            self.detalles = ModificarClasificacion(self,
                    self.lista_clasificaciones[pos])
        else:
             error = "Para modificar la claficacion debe seleccionarla"
             msj = MensajeDeError(error, self.window)
             msj.run()

    def borrar_clasificacion(self, widget):
        pass

    def aceptar(self, widget):
        self.limpiar_campos(widget)
        self.hbox_132.show()
        self.hbox_133.hide()
        self.window.resize(150,200)
        self.lista_resultado.clear()

    def tomar_valor_combo(self, combo):
        diccionario = {1: [self.combo_grupos, self.lista_grupos]}

        model = diccionario[combo][0].get_model()
        index = diccionario[combo][0].get_active()
        if index and combo == 1:
            return diccionario[combo][1][model[index][0]]
        elif index and combo == 2:
            return diccionario[combo][1][model[index][0]]
        elif combo == 1 or combo ==2:
            return diccionario[combo][1][model[0][0]]

    def close(self, widget):
        close(self.window)
